package Busquedas;

import Problemas.Problema;
import java.util.ArrayList;

public class Voraz extends Busqueda {
	
	public Voraz(Problema p) {
		super(p);
	}
	
	//@Override
	public ArrayList<Estado> buscar(boolean controlCiclos) {
		long tiempo1=System.currentTimeMillis();
		Nodo nodo = this.getNodo();
		Nodo hijo;
		nodo.setValorHeuristico(this.getProblema().funcionHeuristica(nodo.getEstado()));
		int op = 0;
		try{
			while (!this.getProblema().estadoFinal(nodo.getEstado())){
				for (op = 0; op < this.getProblema().getnumOper(); op++){
					if (nodo.getOperadoresAplicados()[op]!=1){
						Estado e = this.getProblema().aplicaOperador(nodo.getEstado(),op);
						if (e != null ){
							if (!(controlCiclos && estaEnExpandidos(e))){
								hijo = nodo.anadeHijo(op,e,this.getProblema().getCosteOperador(op));
								hijo.setValorHeuristico(this.getProblema().funcionHeuristica(hijo.getEstado()));
								abiertos.add(hijo);
								expandidos.add(hijo.getEstado());
								int inverso = this.getProblema().getOperadorInverso(op);
								if (inverso != -1) 
									hijo.setOperadoresAplicados(inverso);
							}
						}
					}
				}
                if(!abiertos.isEmpty())
                    nodo = abiertos.remove(indiceMejor());
                else
                    return null;
				contadorNodos++;
				if (contadorNodos>maxContadorNodos) return null;
			}
			this.generaCamino(nodo);
			long tiempo2=System.currentTimeMillis();
			this.setTiempoTotal((tiempo2-tiempo1));
			return camino;
		}catch(OutOfMemoryError e){
			System.out.println(abiertos.size());
			abiertos = null;
			return null;
		}
	}
	
	public int indiceMejor(){
		int indiceMejor = 0;
		int i = 0;
		int menorValor = abiertos.get(0).getValorHeuristico();
		while (i < abiertos.size()){
			if (menorValor > abiertos.get(i).getValorHeuristico()){
				indiceMejor = i;
				menorValor = abiertos.get(i).getValorHeuristico();
			}else{
				i++;
			}
		}
		return indiceMejor;
	}
	
}
